package com.xlh.service.user;

import com.xlh.dto.PageDTO;
import com.xlh.dto.user.UserApplicationDTO;
import com.xlh.dto.user.UserClassDTO;
import com.xlh.dto.user.UserConfigDTO;
import com.xlh.dto.user.UserInfoDTO;
import com.xlh.enums.PermissionEnum;
import com.xlh.enums.user.IdentityEnum;
import com.xlh.enums.user.RoleEnum;
import com.xlh.enums.user.UserStatusEnum;
import com.xlh.param.user.*;
import com.xlh.pojo.system.Permission;
import com.xlh.pojo.user.Class;
import com.xlh.pojo.user.User;
import com.xlh.pojo.user.UserClass;

import java.util.List;
import java.util.Map;

/**
 * 用户
 * <p>
 * Created by lx on 2019/1/28.
 */
public interface UserService {

    /**
     * 根据用户id、用户状态获取用户信息
     *
     * @param userId         用户id 必填
     * @param userStatusEnum 用户状态 非必填
     * @return
     */
    UserInfoDTO getUserInfo(Long userId, UserStatusEnum userStatusEnum);

    /**
     * 获取用户信息
     *
     * @param userIds         用户id集合
     * @param userStatusEnums 查询用户状态的枚举
     * @return
     */
    List<UserInfoDTO> queryUserInfos(List<Long> userIds, List<UserStatusEnum> userStatusEnums);

    /**
     * 根据用户id集合获取用户信息
     *
     * @param userIds 用户id集合
     * @return
     */
    List<User> listUser(List<Long> userIds);

    /**
     * 获取用户信息
     *
     * @param userInfo   用户信息
     * @param roles      角色集合
     * @param statusList 状态集合
     * @param userId     用户id
     * @return
     */
    List<UserInfoDTO> listUser(String userInfo, List<Integer> roles, List<Integer> statusList, Long userId);

    /**
     * 根据工号/学号获取用户信息
     *
     * @param userNumber     学号/工号
     * @param userStatusEnum 查询的用户状态（可为null）
     * @return
     */
    List<User> listUserInfo(String userNumber, UserStatusEnum userStatusEnum);

    /**
     * 根据班级id获取总人数
     *
     * @param classIds 班级id集合
     * @return
     */
    Map<Long, Long> getCountByClassId(List<Long> classIds);

    /**
     * 根据班级id获取用户信息
     *
     * @param classId 班级id
     * @return
     */
    List<Long> getClassUser(Long classId);

    /**
     * 获取学生的班级id
     *
     * @param userId 用户id
     * @return
     */
    List<Class> listClassIdByStudentId(Long userId);

    /**
     * 修改用户信息
     *
     * @param userId      用户id
     * @param updateParam 修改参数
     */
    void updateUserInfo(Long userId, UpdateUserInfoParam updateParam);

    /**
     * 修改用户密码
     *
     * @param userId      用户id
     * @param oldPassword 原始密码
     * @param newPassword 新密码
     */
    void updateUserPassword(Long userId, String oldPassword, String newPassword);

    /**
     * 批量删除用户
     *
     * @param courseId       课程id
     * @param classId        班级id
     * @param userIds        用户id集合
     * @param logicDeleted   是否逻辑删除 true：是 false：真删除
     * @param errorFlag      错误提示 true：继续删除 null：没有作出决定
     * @param updatePreseted 是否修改为预置课程 true：修改 false：不修改
     */
    void batchDeleteUser(Long courseId, Long classId, List<Long> userIds, Boolean logicDeleted, Boolean
            errorFlag, Boolean updatePreseted);

    void batchNaDeleteUser(List<Long> courseId, Long classId, List<Long> userIds, Boolean logicDeleted, Boolean
            errorFlag);

    /**
     * 创建用户
     *
     * @param params       创建用户参数集合
     * @param identityEnum 需要创建角色的身份枚举
     * @param courseIds    课程id的集合
     * @param classId      班级id
     * @param errorFlag    用户对错误提示作出的决定 true：继续导入 false：过滤 null：没有作出决定
     * @return userid      集合
     */
    List<Long> createUser(List<CreateUserParam> params, IdentityEnum identityEnum,
                          List<Long> courseIds, Long classId, Boolean errorFlag);

    /**
     * 添加助教课程关联关系
     *
     * @param coursed 课程id
     * @param userId  用户id
     * @param classId 班级id
     */
    void addAssistant(Long coursed, Long userId, Long classId);

    /**
     * 修改用户
     *
     * @param userId       用户id
     * @param param        修改用户参数
     * @param identityEnum 身份枚举
     */
    void updateUser(Long userId, UserParam param, IdentityEnum identityEnum);

    /**
     * 修改用户信息
     *
     * @param user 用户id
     */
    void updateUserSelective(Long id, User user);

    /**
     * 修改用户状态
     *
     * @param userIds 用户id集合
     * @param param   修改用户参数
     */
    void updateUserStatus(List<Long> userIds, UpdateUserStatusParam param);

    /**
     * 解除授课
     *
     * @param courseId 课程id
     * @param userId   用户id
     */
    void RelievingTeaching(Long courseId, Integer userId);

    /**
     * 创建高效教师参数，返回创建的用户信息
     *
     * @param param 创建参数
     */
    UserApplicationDTO createUniversityTeacherParam(CreateUniversityTeacherParam param);

    /**
     * 创建高效教师下的学生参数
     *
     * @param userId                 教师id
     * @param courseDirectionHideIds 课程体系隐藏的id集合
     * @return
     */
    List<User> createUniversityStudent(Long userId, List<Integer> courseDirectionHideIds);

    /**
     * 获取教师或管理员信息进行分页
     *
     * @param pageNum      页数
     * @param pageSize     每页显示大小
     * @param userInfo     用户信息
     * @param roleEnum     角色
     * @param identityEnum 身份枚举
     * @return
     */
    PageDTO<UserInfoDTO> listUserByPage(Integer pageNum, Integer pageSize, String userInfo,
                                        RoleEnum roleEnum, IdentityEnum identityEnum);

    PageDTO<UserInfoDTO> listUserOtherTeacherByPage(Integer pageNum, Integer pageSize, Long courseId,
                                                    String userInfo);

    /**
     * 根据身份获取用户
     *
     * @param identityEnum 身份枚举
     * @return
     */
    List<User> queryUser(IdentityEnum identityEnum);

    /**
     * 查询班级历史
     *
     * @param classInfo 班级信息
     * @param userId    教师id
     * @return
     */
    List<UserClassDTO> queryHistoryClass(String classInfo, Long userId);

    /**
     * 获取某班级下的学生id
     *
     * @param classId 班级id
     * @return
     */
    List<UserClass> listUserClass(Long classId);

    /**
     * 对某班级进行批量添加用户id
     *
     * @param userIds 学生id集合
     * @param classId 班级id
     */
    void insertBatchUserClass(List<Long> userIds, Long classId);

    /**
     * 批量删除班级用户
     *
     * @param classIds     班级id集合
     * @param userIds      用户id集合
     * @param logicDeleted 逻辑删除 true：逻辑删除 false：真删除
     */
    void batchDeleteUserClass(List<Long> classIds, List<Long> userIds, Boolean logicDeleted);

    /**
     * 获取班级下的学生哪些学生是多个班级
     *
     * @param classId 班级id
     * @return
     */
    List<Long> getStudentMoreClass(Long classId);

    /**
     * 获取班级用户信息
     *
     * @param classIds 班级id集合
     * @param userInfo 用户信息
     * @return
     */
    List<UserInfoDTO> queryClassUser(List<Long> classIds, String userInfo);

    /**
     * 获取导入班级列表
     *
     * @param classIds 班级id集合
     * @param userInfo 用户信息
     * @return
     */
    List<UserInfoDTO> queryClassUser(List<Long> classIds, String userInfo, List<Integer> studentIds);

    /**
     * 获取班级用户信息
     *
     * @param userInfo   用户信息
     * @param classIds   班级id集合
     * @param statusList 状态集合
     * @param deleted    是否删除
     * @return
     */
    List<UserInfoDTO> queryClassUser(String userInfo, List<Long> classIds, List<Integer> statusList, Boolean deleted);

    /**
     * 获取学生信息
     *
     * @param userNumber 学号
     * @return
     */
    UserInfoDTO getStudentInfo(String userNumber, Integer identity);

    /**
     * 删除用户session
     *
     * @param userIds 用户id集合
     */
    void deleteUserSession(List<Long> userIds);

    /**
     * 获取默认班级用户信息
     *
     * @param courseId 课程id
     * @return
     */
    List<UserInfoDTO> queryDefaultClassUser(Long courseId);

    /**
     * 获取用户权限配置
     *
     * @return
     */
    UserConfigDTO queryUserPermission();

    /**
     * 修改用户配置
     *
     * @param userPermissionParam 用户配置权限参数
     */
    void updateUserConfig(UserPermissionParam userPermissionParam);

    /**
     * 获取用户权限配置
     *
     * @param userId 用户id
     * @return
     */
    List<Permission> queryUserPermission(Long userId);

    /**
     * 获取学校名称
     *
     * @return
     */
    List<String> querySchoolNames();

    /**
     * 获取user信息
     *
     * @param userId 用户id
     * @return
     */
    User getUser(Long userId);

    /**
     * 获取用户的班级
     *
     * @param userIds 用户id集合
     * @return
     */
    List<UserClass> queryUserClass(List<Long> userIds);

    void updatePermission(List<Long> objIds, PermissionEnum permissionEnum, boolean switchOn);

}
